
#include "main.h"

/*采样数据IS定义在ECU_ADC文件中 Ecu_Adc_Cov_Index中*/
typedef enum
{
    HS1_CH=0,
    HS2_CH,
    HS3_CH,
    HS4_CH,
    HS5_CH,
    HS6_CH,
    HS7_CH,
    HS8_CH,
    MAX_CH,
}Ecu_HS_Relay_Ch;

typedef struct
{
    Ecu_HS_Relay_Ch ch; /*继电器通道*/
    u8 port;            /*端口编号*/
    GPIO_Type *base;    /*端口地址*/
    u32 pin;            /*Relay to MCU IO pin*/
    u8 sts;             /*继电器状态*/
}Ecu_Hs_Relay_Conf;

Ecu_Hs_Relay_Conf relayConf[MAX_CH]={
    {HS1_CH,Bsw_Port_E,PTE,PIN10_IDX},  /*PTE10 As HS1_EN*/
    {HS2_CH,Bsw_Port_D,PTD,PIN1_IDX},   /*PTD1 As HS2_EN*/
    {HS3_CH,Bsw_Port_E,PTE,PIN12_IDX},  /*PTE12 As HS3_EN*/
    {HS4_CH,Bsw_Port_E,PTE,PIN3_IDX},   /*PTE3 As HS4_EN*/
    {HS5_CH,Bsw_Port_E,PTE,PIN13_IDX},  /*PTE13 As HS5_EN*/
    {HS6_CH,Bsw_Port_E,PTE,PIN14_IDX},  /*PTE14 As HS6_EN*/
    {HS7_CH,Bsw_Port_D,PTD,PIN17_IDX},  /*PTD17 As HS7_EN*/
    {HS8_CH,Bsw_Port_D,PTD,PIN16_IDX},  /*PTD16 As HS8_EN*/
};



void ECU_RELAY_OPEN_Ch(uint8 ch)
{
    BSW_GPIO_SetBits(relayConf[ch].base,relayConf[ch].pin);    
    relayConf[ch].sts=1;
}

void ECU_RELAY_CLOSE_Ch(uint8 ch)
{
    BSW_GPIO_ResetBits(relayConf[ch].base,relayConf[ch].pin);
    relayConf[ch].sts=0;
}

/********************************************************
**函数：	ECU_RELAY_INIT
**功能：	配置BMS的RELAY外设
**输入：	无
**输出：	无
**注意：	根据原理图配置指定的PORT引脚
*********************************************************/
void ECU_RELAY_INIT(void)
{
    //初始化Relay使能脚参数
    for(Ecu_HS_Relay_Ch ch=HS1_CH;ch<MAX_CH;ch++)
    {
        BSW_GPIO_MUX_CONFIG(relayConf[ch].port,relayConf[ch].pin,PORT_MUX_AS_GPIO);
        BSW_GPIO_Direction(relayConf[ch].base,relayConf[ch].pin,1);//输出
        ECU_RELAY_CLOSE_Ch(ch);
    }
    
    BSW_GPIO_MUX_CONFIG(Bsw_Port_D,PIN0_IDX,PORT_MUX_AS_GPIO);/*PTD0 As DIAG_SEL*/
    BSW_GPIO_Direction(PTD,PIN0_IDX,1);//输出
    BSW_GPIO_MUX_CONFIG(Bsw_Port_E,PIN11_IDX,PORT_MUX_AS_GPIO);/*PTE11 As DIAG_EN*/
    BSW_GPIO_Direction(PTE,PIN11_IDX,1);//输出
    BSW_GPIO_ResetBits(PTE,PIN11_IDX);//(DEN=0,DSEL=*):不使能诊断
}



/********************************************************
**函数：	ECU_RELAY_OPEN
**功能：	控制继电器输出
**输入：	无
**输出：	无
**注意：	继电器输出需要两级控制
*********************************************************/
void ECU_RELAY_OPEN(void)
{
    for(Ecu_HS_Relay_Ch ch=HS1_CH;ch<MAX_CH;ch++)
    {
        ECU_RELAY_OPEN_Ch(ch);
    }
}

/********************************************************
**函数：	ECU_RELAY_CLOSE
**功能：	控制继电器关闭
**输入：	无
**输出：	无
**注意：	继电器关闭需要两级控制
*********************************************************/
void ECU_RELAY_CLOSE(void)
{
    for(Ecu_HS_Relay_Ch ch=HS1_CH;ch<MAX_CH;ch++)
    {
        ECU_RELAY_CLOSE_Ch(ch);
    }
}

void ECU_RELAY_Diag_Upper(void)
{
    BSW_GPIO_SetBits(PTE,PIN11_IDX);//(DEN=0,DSEL=*):不使能诊断
    BSW_GPIO_ResetBits(PTD,PIN0_IDX);//(DEN=1,DSEL=0)
}
void ECU_RELAY_Diag_Lower(void)
{
    BSW_GPIO_SetBits(PTE,PIN11_IDX);//(DEN=0,DSEL=*):不使能诊断
    BSW_GPIO_SetBits(PTD,PIN0_IDX);//(DEN=1,DSEL=1)
}

void ECU_Relay_Test(void)
{
    static u32 tick = 0;
    static u32 times=0;

    if(tick==0)
        tick = get_systick_ms();
    
    if(get_systick_ms()-tick>10000){
        if(times++%2!=0)
            ECU_RELAY_OPEN();
        else
            ECU_RELAY_CLOSE();
        tick=0;
    }

}


void ECU_Relay_Diag(void)
{
    static u8 s_u8_EcuDiag_Step = 0;
    static u32 tick = 0;
    
    if(s_u8_EcuDiag_Step==0)
    {
        ECU_RELAY_Diag_Upper();
        tick=get_systick_ms();//启动定时
        s_u8_EcuDiag_Step=1;
    }
    else if(s_u8_EcuDiag_Step==1)
    {
        //延迟等待结果
        if(get_systick_ms()-tick>2000)
            s_u8_EcuDiag_Step=2;
    }
    else if(s_u8_EcuDiag_Step==2)
    {
        ECU_RELAY_Diag_Lower();
        tick=get_systick_ms();
        s_u8_EcuDiag_Step=3;
    }
    else if(s_u8_EcuDiag_Step==3)
    {
        //延迟等待结果
        if(get_systick_ms()-tick>2000)//启动定时
            s_u8_EcuDiag_Step=0;
    }
}
/*************************************************************
    u8 G_u8_Rly_Sts = 0;
	if((G_u8_Rly_Sts & 0x03) != 0x03)
	{
		if((G_u8_Rly_Sts & BIT(0)) != BIT(0))
		{
			OPEN_RELAY_CL;
			G_u8_Rly_Sts |= BIT(0);
		}
		else if((G_u8_Rly_Sts & BIT(1)) != BIT(1))
		{
			OPEN_RELAY_CH;
			G_u8_Rly_Sts |= BIT(1);
		}
	}
***********************************************************/

/**********************************************
	if(G_u8_Rly_Sts & 0x03)
	{
		if((G_u8_Rly_Sts & BIT(1)) == BIT(1))
		{
			CLOSE_RELAY_CH;
			G_u8_Rly_Sts &= ~BIT(1);
		}
		else if((G_u8_Rly_Sts & BIT(0)) == BIT(0))
		{
			CLOSE_RELAY_CL;
			G_u8_Rly_Sts &= ~BIT(0);
		}
	}
***********************************************/



